package thread.communicate.tradition.communication;

import thread.unsafeExample.SafeAccount;

/**
 * 如果每个线程执行的代码不同，这时候需要用不同的Runnable对象，有如下两种方式来实现这些Runnable对象之间的数据共享：
 * Method A:
 *将共享数据封装在另外一个对象中，然后将这个对象逐一传递给各个Runnable对象。
 * 每个线程对共享数据的操作方法也分配到那个对象身上去完成，
 * 互斥,以及线程间的通讯,放在共享数据对象中实现,本例 通信放在 SafeAccount中实现.
 * 这样容易实现针对该数据进行的各个操作的互斥和通信。
 *
 * Created by 4790K_NSL on 2017/4/19.
 */
public class DiffRunnableCommunicationA {

    public static void main(String[] args) {
        final SafeAccount safeAccount=new SafeAccount(1,100);
        final double saveMoney=10;
        final double drawMoney=50;
        final boolean[] flag={true};

        Runnable runnableA=new Runnable() {
            @Override
            public void run() {
                while(judge(safeAccount)){
                    safeAccount.draw(drawMoney);
                }

            }
        };

        Runnable runnableB=new Runnable() {
            @Override
            public void run() {
                while(judge(safeAccount)) {
                    safeAccount.draw(drawMoney);
                }
            }
        };

        Runnable runnableC=new Runnable() {
            @Override
            public void run() {
                while(judge(safeAccount)) {
                    safeAccount.save(saveMoney);
                }
            }
        };

        new Thread(runnableA).start();
        new Thread(runnableB).start();
        new Thread(runnableC).start();

    }

    public static boolean judge(SafeAccount safeAccount){
        if(safeAccount.getAmount()>=0)
            return true;
        return false;
    }


}
